001 /*
002 * Copyright 1996-2005 Mort Bay Consulting Pty. Ltd.
003 * Copyright 2006 Stephen McConnell.
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package net.dpml.test.http;
019
020 import java.io.IOException;
021 import java.io.OutputStream;
022 import java.io.PrintWriter;
023
024 import javax.servlet.RequestDispatcher;
025 import javax.servlet.ServletConfig;
026 import javax.servlet.ServletContext;
027 import javax.servlet.ServletException;
028 import javax.servlet.ServletOutputStream;
029 import javax.servlet.http.HttpServlet;
030 import javax.servlet.http.HttpServletRequest;
031 import javax.servlet.http.HttpServletRequestWrapper;
032 import javax.servlet.http.HttpServletResponse;
033 import javax.servlet.http.HttpServletResponseWrapper;
034
035 /** Test Servlet RequestDispatcher.
036 *
037 * @author Greg Wilkins (gregw)
038 */
039 public class DispatchServlet extends HttpServlet
040 {
041 /**
042 * Servlet initialization.
043 * @param config the servlet config
044 * @exception ServletException in an initialization error occurs
045 */
046 public void init( ServletConfig config ) throws ServletException
047 {
048 super.init( config );
049 }
050
051 /**
052 * Process a post request.
053 * @param sreq the servlet http request
054 * @param sres the servlet http response
055 * @exception ServletException in a processing error occurs
056 * @exception IOException in an I/O error occurs
057 */
058 public void doPost( HttpServletRequest sreq, HttpServletResponse sres )
059 throws ServletException, IOException
060 {
061 doGet( sreq, sres );
062 }
063
064 /**
065 * Process a get request.
066 * @param sreq the servlet http request
067 * @param sres the servlet http response
068 * @exception ServletException in a processing error occurs
069 * @exception IOException in an I/O error occurs
070 */
071 public void doGet( HttpServletRequest sreq, HttpServletResponse sres )
072 throws ServletException, IOException
073 {
074 if( sreq.getParameter( "wrap" ) != null )
075 {
076 sreq = new HttpServletRequestWrapper( sreq );
077 sres = new HttpServletResponseWrapper( sres );
078 }
079
080 String prefix;
081 if( sreq.getContextPath() != null )
082 {
083 prefix = sreq.getContextPath() + sreq.getServletPath();
084 }
085 else
086 {
087 prefix = sreq.getServletPath();
088 }
089
090 String info;
091 if( sreq.getAttribute( "javax.servlet.include.servlet_path" ) != null )
092 {
093 info = (String) sreq.getAttribute( "javax.servlet.include.path_info" );
094 }
095 else
096 {
097 info = sreq.getPathInfo();
098 }
099
100 if( info == null )
101 {
102 info= "NULL";
103 }
104
105 if( info.startsWith( "/includeW/" ) )
106 {
107 doGetIncludeW( info, sreq, sres );
108 }
109 else if( info.startsWith( "/includeS/" ) )
110 {
111 doGetIncludeS( info, sreq, sres );
112 }
113 else if( info.startsWith( "/forward/" ) )
114 {
115 doGetForward( info, sreq, sres );
116 }
117 else if( info.startsWith( "/forwardC/" ) )
118 {
119 doGetForwardC( info, sreq, sres );
120 }
121 else if( info.startsWith( "/forwardSC/" ) )
122 {
123 doGetForwardSC( info, sreq, sres );
124 }
125 else if( info.startsWith( "/includeN/" ) )
126 {
127 doGetIncludeN( info, sreq, sres );
128 }
129 else if( info.startsWith( "/forwardN/" ) )
130 {
131 doGetForwardN( info, sreq, sres );
132 }
133 else
134 {
135 sres.setContentType( "text/html" );
136 PrintWriter pout= sres.getWriter();
137 pout.write(
138 "<H1>Dispatch URL must be of the form: </H1>"
139 + "<PRE>"
140 + prefix
141 + "/includeW/path\n"
142 + prefix
143 + "/includeS/path\n"
144 + prefix
145 + "/forward/path\n"
146 + prefix
147 + "/includeN/name\n"
148 + prefix
149 + "/forwardC/_context/path\n"
150 + prefix
151 + "/forwardSC/_context/path</PRE>" );
152 pout.flush();
153 }
154 }
155
156 private void doGetIncludeW( String info, HttpServletRequest sreq, HttpServletResponse sres )
157 throws ServletException, IOException
158 {
159 sres.setContentType( "text/html" );
160 info = info.substring( 9 );
161 if( info.indexOf( '?' ) < 0 )
162 {
163 info += "?Dispatch=include";
164 }
165 else
166 {
167 info += "&Dispatch=include";
168 }
169
170 PrintWriter pout = null;
171 pout = sres.getWriter();
172 pout.write(
173 "<H1>Include (writer): "
174 + info
175 + "</H1><HR>" );
176
177 RequestDispatcher dispatch =
178 getServletContext().getRequestDispatcher( info );
179 if( dispatch == null )
180 {
181 pout = sres.getWriter();
182 pout.write( "<H1>Null dispatcher</H1>" );
183 }
184 else
185 {
186 dispatch.include( sreq, sres );
187 }
188 pout.write( "<HR><H1>-- Included (writer)</H1>" );
189 }
190
191 private void doGetIncludeS( String info, HttpServletRequest sreq, HttpServletResponse sres )
192 throws ServletException, IOException
193 {
194 sres.setContentType( "text/html" );
195 info = info.substring( 9 );
196 if( info.indexOf( '?' ) < 0 )
197 {
198 info += "?Dispatch=include";
199 }
200 else
201 {
202 info += "&Dispatch=include";
203 }
204
205 OutputStream out = null;
206 out = sres.getOutputStream();
207 out.write(
208 (
209 "<H1>Include (outputstream): "
210 + info
211 + "</H1><HR>"
212 ).getBytes()
213 );
214
215 RequestDispatcher dispatch =
216 getServletContext().getRequestDispatcher( info );
217 if( dispatch == null )
218 {
219 out = sres.getOutputStream();
220 out.write( "<H1>Null dispatcher</H1>".getBytes() );
221 }
222 else
223 {
224 dispatch.include( sreq, sres );
225 }
226 out.write( "<HR><H1>-- Included (outputstream)</H1>".getBytes() );
227 }
228
229 private void doGetForward( String info, HttpServletRequest sreq, HttpServletResponse sres )
230 throws ServletException, IOException
231 {
232 info = info.substring( 8 );
233 if( info.indexOf( '?' ) < 0 )
234 {
235 info += "?Dispatch=forward";
236 }
237 else
238 {
239 info += "&Dispatch=forward";
240 }
241
242 RequestDispatcher dispatch =
243 getServletContext().getRequestDispatcher( info );
244
245 if( dispatch != null )
246 {
247 ServletOutputStream out = sres.getOutputStream();
248 out.print( "Can't see this" );
249 dispatch.forward( sreq, sres );
250 try
251 {
252 out.println( "IOException" );
253 throw new IllegalStateException();
254 }
255 catch( IOException e )
256 {
257 }
258 }
259 else
260 {
261 sres.setContentType( "text/html" );
262 PrintWriter pout= sres.getWriter();
263 pout.write( "<H1>No dispatcher for: " + info + "</H1><HR>" );
264 pout.flush();
265 }
266 }
267
268 private void doGetForwardC( String info, HttpServletRequest sreq, HttpServletResponse sres )
269 throws ServletException, IOException
270 {
271 info = info.substring( 9 );
272 if( info.indexOf( '?' ) < 0 )
273 {
274 info += "?Dispatch=forward";
275 }
276 else
277 {
278 info += "&Dispatch=forward";
279 }
280
281 String cpath = info.substring( 0, info.indexOf( '/', 1 ) );
282 info = info.substring( cpath.length() );
283 ServletContext context= getServletContext().getContext( cpath );
284 RequestDispatcher dispatch = context.getRequestDispatcher( info );
285
286 if( dispatch != null )
287 {
288 dispatch.forward( sreq, sres );
289 }
290 else
291 {
292 sres.setContentType( "text/html" );
293 PrintWriter pout = sres.getWriter();
294 pout.write(
295 "<H1>No dispatcher for: "
296 + cpath
297 + "/"
298 + info
299 + "</H1><HR>" );
300 pout.flush();
301 }
302 }
303
304 private void doGetForwardSC( String info, HttpServletRequest sreq, HttpServletResponse sres )
305 throws ServletException, IOException
306 {
307 sreq.getSession( true );
308 info = info.substring( 10 );
309 if( info.indexOf( '?' ) < 0 )
310 {
311 info += "?Dispatch=forward";
312 }
313 else
314 {
315 info += "&Dispatch=forward";
316 }
317 String cpath = info.substring( 0, info.indexOf( '/', 1 ) );
318 info = info.substring( cpath.length() );
319
320 ServletContext context = getServletContext().getContext( cpath );
321 RequestDispatcher dispatch = context.getRequestDispatcher( info );
322
323 if( dispatch != null )
324 {
325 dispatch.forward( sreq, sres );
326 }
327 else
328 {
329 sres.setContentType( "text/html" );
330 PrintWriter pout= sres.getWriter();
331 pout.write(
332 "<H1>No dispatcher for: "
333 + cpath
334 + "/"
335 + info
336 + "</H1><HR>" );
337 pout.flush();
338 }
339 }
340
341 private void doGetIncludeN( String info, HttpServletRequest sreq, HttpServletResponse sres )
342 throws ServletException, IOException
343 {
344 sres.setContentType( "text/html" );
345 info = info.substring( 10 );
346 if( info.indexOf( "/" ) >= 0 )
347 {
348 info = info.substring( 0, info.indexOf( "/" ) );
349 }
350 PrintWriter pout;
351 if( info.startsWith( "/null" ) )
352 {
353 info = info.substring( 5 );
354 }
355 else
356 {
357 pout = sres.getWriter();
358 pout.write(
359 "<H1>Include named: "
360 + info
361 + "</H1><HR>" );
362 }
363
364 RequestDispatcher dispatch =
365 getServletContext().getNamedDispatcher( info );
366 if( dispatch != null )
367 {
368 dispatch.include( sreq, sres );
369 }
370 else
371 {
372 pout = sres.getWriter();
373 pout.write(
374 "<H1>No servlet named: "
375 + info
376 + "</H1>" );
377 }
378
379 pout = sres.getWriter();
380 pout.write( "<HR><H1>Included " );
381 }
382
383 private void doGetForwardN( String info, HttpServletRequest sreq, HttpServletResponse sres )
384 throws ServletException, IOException
385 {
386 info = info.substring( 10 );
387 if( info.indexOf( "/" ) >= 0 )
388 {
389 info= info.substring( 0, info.indexOf( "/" ) );
390 }
391 RequestDispatcher dispatch =
392 getServletContext().getNamedDispatcher( info );
393 if( dispatch != null )
394 {
395 dispatch.forward( sreq, sres );
396 }
397 else
398 {
399 sres.setContentType( "text/html" );
400 PrintWriter pout = sres.getWriter();
401 pout.write(
402 "<H1>No servlet named: "
403 + info
404 + "</H1>" );
405 pout.flush();
406 }
407 }
408
409 /**
410 * Return thr servlet info.
411 * @return the info
412 */
413 public String getServletInfo()
414 {
415 return "Include Servlet";
416 }
417
418 /**
419 * Destroy the servlet.
420 */
421 public synchronized void destroy()
422 {
423 }
424
425 }